<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>JavaScript 学习之旅之Node.js</title>
	</head>
	<body>
	  一、基础
		1.npm 是Node.js 的包管理器，可以自动加载依赖包
		2.对于Node.js来说，每一个js文件均是一个模块，模块可以提供给其他模块调用。
	    3.要在模块中输出变量使用：module.exports = variable;
	    4.引入其他模块输出的对象：var foo = require（'other_module');有时需要带上路径
	    Node.js 实现模块这个功能是利用了Javascript是一种函数式编程语言，支持闭包的特性。
	 二、Node.js基本模块
	    1.global Node.js的唯一全局对象
	            命令行查询：global.console
	    2.process 表示当前Node.js对象
	      process.nextTick():下一次事件响应执行
	    
		    简单判断JavaScript执行环境：
		    if(typeof(window) === 'underfined'){
		    	console.log('node.js');
		    }else{
		    	console.log('browser');
		    }
		3.fs fs模块是文件系统模块，负责读写文件，该模块同事提供了异步和同步的方法。
		  例：
		    a.异步读取文件
			    'use strict'
			    var fs = require('fs');
			    fs.readFile('sample.txt','utf-8',function(err,data){
			    	if(err){
			    		console.log(err);
			    	}else{
			    		console.log(data);
			    	}
			    });
			      注意读取二进制等文件稍微有点不同，会返回一个Buffer对象
			      在Node.js中，Buffer对象是一个包含零个或任意字节的数组，跟Array不同。
			b.同步读取
			    var fs = require('fs');
			    var data = fs.readFileSync('sample.txt','utf-8');
			    console.log(data);
			    同步调用直接返回data，可以用try...catch 捕获错误。
			c.写文件
			  使用fs.writeFile()/writeFileSync() 异步/同步实现。
			  例：
			  var fs = require('fs');
			  var data = 'Hello,Node.js!';
			  fs.writeFile('output.txt',data,function(err){
			  	if(err){
			  		console.log(err);
			  	}else{
			  		console.log('ok');
			  	}
			  });
			d.fs.stat()/fs.statSync() 返回一个Stat()对象，返回文件或目录的详细信息。
		3.stream Node.js提供的有一个仅在服务区端可用的模块，目的是支持“流”这种数据结构。
		      流读取：createReadStrem(),通过事件获取判断数据。
		      data:data事件表示流的数据已经可以读取了；
		      end：end事件表示这个流已经到末尾了；
		      error：error事件表示出错了
		      例：
		      'use strict';
		      var fs = require('fs');
		      //打开一个流
		      var rs = fs.createReadStream('sample.txt','utf-8');
		      rs.on('data',function(chunk){
		      	console.log('DATA');
		      	console.log(chunk);
		      });
		      
		      rs.on('end',function(){
		      	console.log('END');
		      });
		      
		      rs.on('error',function(err){
		      	console.log('ERROR:'+err);
		      });
		       流写入文件：
		              创建流文件：var wsl= createWriteStream('output1.txt','utf-8');
		              写入流：wsl.write('使用Stream写入文件..\n');
		              结束写入：wsl.end();
		        例：
		        'use strict';
		        var fs = require('fs');
		        var wsl = fs.createWriteStream('output1.txt');
		        wsl.write('kkkkkkk');
		        <!--
                	wsl.write(new Buffer('写入二进制数据'，'utf-8');
                -->
                wsl.end();
        ***所有可以读取数据的流都继承自stream.Readable,所有可以写入的流都继承自stream.Writable.
        4.pipe 可以把一个文件流和另一个流串起来了。
        5.http 模块
          request 对象封装HTTP请求
          respose 对象封装HTTP响应
        6.crypto 模块提供了通用的加密和哈希算法,详细参见js/crypto.js
        7.Node 框架
          koa ,koa 是Express的下一代基于Node.js的web框架。
	</body>
</html>
